今天我們來解一道 LeetCode 的經典題目:Longest Substring Without Repeating Characters。這道題目考驗字串處理的能力,如何有效率地搜尋和處理重複字元。
題目:
給定一個字串 s
,請你找出其中不含重複字元的最長子串的長度。
範例:
輸入:s = "abcabcbb"
輸出:3
解釋:由於無重複字元的子串是 "abc",所以答案是 3。
這題可以使用滑動視窗(Sliding Window)來解,滑動視窗核心思想是使用兩個指標來表示目前視窗的範圍,然後動態調整這個視窗來找到最佳解。
這邊同時利用一個不重覆的容器 unordered_set 來存放目前視窗裡的不重複的字元,
一開始移動 right 指標來增加視窗大小,然後判斷是否遇到重複的字元,這裡用 set.find(c) == set.end()
來判斷是否重複,用 set.count(c) == 0
也可以。
沒有重複就一直移動 right 指標,並在 set 加入字元,然後更新不重複最大長度 maxlen
當遇到重複時,set 就移除重複字元,然後移動 left 指標縮小視窗。
實作:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_set<char> set;
int maxlen = 0;
int left = 0, right = 0;
while (right < s.size()) {
if (set.find(s[right]) == set.end()) { // 無重複
set.insert(s[right]);
maxlen = max(right-left+1, maxlen);
right++;
} else { // 有重複
set.erase(s[left]);
left++;
}
}
return maxlen;
}
};
參考:
#3. Longest Substring Without Repeating Characters